AWS Managed Microsoft ADの認証情報を使ってAWSマネジメントコンソールにログインしてみた
ADの認証情報を使ってAWSマネジメントコンソールにログインしたい
こんにちは、のんピ(@non____97)です。
皆さんはADの認証情報を使ってAWSマネジメントコンソールにログインしたいなと思ったことはありますか? 私はあります。
AWS IAM Identity Center(旧AWS SSO)のIDソースをADの認証情報とすることで、ADの認証情報を使ってAWSマネジメントコンソールにログインが可能です。
しかし、AWS IAM Identity Centerを利用できない場面もあると思います。
何となくAWS公式ドキュメントを漁ってみると、AWS IAM Identity Centerを使わずに、ADの認証情報でAWSマネジメントコンソールにログインできると紹介しているページがありました。
早速試したみたので、紹介します。
AD Connector編は以下記事をご参照ください。
いきなりまとめ
- AWS IAM Identity Centerを使わずに、AWS Managed Microsoft ADの認証情報でAWSマネジメントコンソールにログインできる
- AWS IAM Identity Centerを使わずに、AWS Managed Microsoft ADの認証情報でAWSマネジメントコンソールにログインする場合はアクセスURLを作成する必要がある
- ログインできるドメインユーザーはユーザー単位もしくはグループ単位で指定する
- 操作できる権限はIAMロールで指定する
- IAMロールの信頼関係でプリンシパルとして
ds.amazonaws.com
を指定する必要がある - AWS Managed Microsoft ADはリージョナルサービスなので、可用性を向上させる場合にはマルチリージョンレプリケーションを行う
- 個人的には「AWS IAM Identity Centerが使用できない」 & 「既存のADの認証情報を使ってログインできないと困る」という要件が出てきた時に使うかなという印象
検証の環境
検証の環境は以下の通りです。
Managed Microsoft ADの認証情報を使ってIAMポリシーAmazonEC2ReadOnlyAccess
をアタッチしたIAMロールにAssume Roleし、AWSマネジメントコンソールにログインできるか確認します。
検証環境の構築
検証環境はAWS CDKでデプロイします。
利用したコードは以下リポジトリに保存しています。
ADの認証情報でAWSマネジメントコンソールにログインするにはアクセスURLの作成が必要です。
ディレクトリメンバーにコンソールへのアクセス権限を付与する際には、ディレクトリにアクセス するための URL を設定しておく必要があります。ディレクトリの詳細表示およびアクセス URL の取得に関する詳細は、「ディレクトリ情報の表示」を参照してください。アクセス URL 作成方法の詳細については、「アクセス URL の作成」を参照してください。
今回はアクセスURLの作成もCloudFormationで行いました。Managed Microsoft ADのパラメーターcreateAlias
でtrue
を指定します。
const managedMSAD = new directoryservice.CfnMicrosoftAD( this, "Managed Microsoft AD", { name: domainName, password: new CfnDynamicReference( CfnDynamicReferenceService.SECRETS_MANAGER, `${managedMSADSecret.secretArn}:SecretString:password` ).toString(), vpcSettings: { subnetIds: vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_ISOLATED, }).subnetIds, vpcId: vpc.vpcId, }, createAlias: true, edition: "Standard", enableSso: false, } );
CloudFormationでアクセスURLを作成する場合は、スタック名-Managed MSADの名前-ランダムな文字列
となります。任意の文字列をアクセスURLにする場合は、Managed
Microsoft ADデプロイ後にコンソールから作成してください。
AWSマネジメントコンソールへのアクセスできるように設定
以下AWS公式ドキュメントを参考に、Managed Microsoft ADの認証情報を使ってAWSマネジメントコンソールにログインできるように設定していきます。
まず、作成されたManaged Microsoft ADにアクセスして、アクセスURLが作成されていることを確認します。
下にスクロールすると、AWSマネジメントコンソールという項目が表示されます。コンソールアクセスへ委任できるIAMロールが表示されていますね。
Managed Microsoft ADの認証情報を使ってAWSマネジメントコンソールにログインできるようにアクション
-有効化
をクリックします。
有効化が正常にできるとステータスが有効
になります。次に、Managed Microsoft AD内のドメインユーザーがIAMロールにAssumeRoleしてマネジメントコンソールにログインできるようにします。表示されているIAMロールをクリックします。
追加
をクリックします。
Admin
で検索して、ドメインのAdminユーザーを選択し追加
をクリックします。
ドメインのAdminユーザーが追加されたことを確認します。
それではManaged Microsoft ADの認証情報を使ってマネジメントコンソールにログインします。
`https://アクセスURL/console/`(今回の場合は`https://managedmsadstack-managedmicrosoftad-rtletr8o8whr.awsapps.com/console/`)にアクセスします。すると以下のようにログイン画面が表示されます。
ドメインのAdminユーザーの認証情報を入力してサインイン
をクリックすると、マネジメントコンソールにログインできました。
S3のコンソールを確認すると、権限不足でバケット一覧は確認できませんでした。
EC2のコンソールを確認すると、こちらはIAMロールでIAMポリシーAmazonEC2ReadOnlyAccess
を指定しているので、各種情報を確認できました。
CloudTrailでログイン時に発行されたAPIを確認すると、AssumedRole
とConsoleLogin
が記録されていました。
- AssumeRole
{ "eventVersion": "1.08", "userIdentity": { "type": "AWSService", "invokedBy": "ds.amazonaws.com" }, "eventTime": "2022-08-17T04:44:16Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "awsRegion": "us-east-1", "sourceIPAddress": "ds.amazonaws.com", "userAgent": "ds.amazonaws.com", "requestParameters": { "roleArn": "arn:aws:iam::<AWSアカウントID>:role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G", "roleSessionName": "Admin", "externalId": "<AWSアカウントID>" }, "responseElements": { "credentials": { "accessKeyId": "ASIA6KUFAVPU2APONTSQ", "sessionToken": "IQoJb3JpZ2luX2VjEH0aCXVzLWVhc3QtMSJIMEYCIQDhL6ctbZp5ICugaAFgxW2Vt2o0PYjK/vnoMaPdOiBGowIhAPU4iHO0Ly6BTcxts7iF0WV+5JSoh0K11Tp8qvWzJamDKskCCOb//////////wEQAhoMOTg0OTAwMjE3ODMzIgzJMyjNTyf1BOqsTzAqnQJ2OMIuLc4E2SdnStcydx3Q7uJrTNacdHIQ3kvGv2eVpLGCCSU4EeU9xjQEqw3Z5yGRNWfsMGLqCMILUpp+iAGNBLgNQ8yqxaObRHAkQofN1ZHxDqO9eo9GC1QOITICUygWRzRLysFsiieAjI9/wnWs8fmyYHGFVXh+AEGeCjiAW/H7rJW7mDURhDS8ZdT3hwM2b8r2goKMB5TbkT4lzrnPxZeokjmzkZ0UnRa5ThiEGh+asRJsWtxxJs7K+kg0pePjF3a18Pb8izmctw0ckiNs8Yn2Nd4ZzKuod0/mJ14xJGkF4UicMo6jOXsTjXBGfAJFxiTVqyzmagokiOMlt55uPHon2HHf/j+TW9DojzKRgdUeJu8FnunstkKG22YwoOTxlwY6vgEIm37U8paTG2XRGZ4l6Hh3ytqadnTS8pnaMAvXg62qfbZQlEpzZjv/SLUwPO0KItvYIPk33GA2/pICIBznlGfUPdkJYoLU3L3MjSBtBaG4T62nr7qjDLiEa2YYXzC+UgBsqgxZLtJmxuNUrpUwobex0EqO1/d4nbhPkQklpaEnWFUw5wXbhaMa4mCqb0K2P+6W3ZqplU3usf/9Rw3Za3rYZAKNBbPQDBccRLySP7wcilMEb45NCXpZfUzOLMgC", "expiration": "Aug 17, 2022, 5:44:16 AM" }, "assumedRoleUser": { "assumedRoleId": "AROA6KUFAVPU2KCBLNW4E:Admin", "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G/Admin" } }, "requestID": "8d9830d0-e9dd-491d-a5e4-43fa1623bba1", "eventID": "53b24437-583c-4e2b-9afa-24c73f6cb69a", "readOnly": false, "resources": [ { "accountId": "<AWSアカウントID>", "type": "AWS::IAM::Role", "ARN": "arn:aws:iam::<AWSアカウントID>:role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "<AWSアカウントID>", "sharedEventID": "79009513-4c40-4249-a311-14e890acce43", "eventCategory": "Management" }
- ConsoleLogin
{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AROA6KUFAVPU2KCBLNW4E:Admin", "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G/Admin", "accountId": "<AWSアカウントID>", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROA6KUFAVPU2KCBLNW4E", "arn": "arn:aws:iam::<AWSアカウントID>:role/ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G", "accountId": "<AWSアカウントID>", "userName": "ManagedMsadStack-AWSmanagementconsoleloginIAMRoleE-1CRB6P8P6DL6G" }, "webIdFederationData": {}, "attributes": { "creationDate": "2022-08-17T04:44:16Z", "mfaAuthenticated": "false" } }, "invokedBy": "ds.amazonaws.com" }, "eventTime": "2022-08-17T04:44:17Z", "eventSource": "signin.amazonaws.com", "eventName": "ConsoleLogin", "awsRegion": "us-east-1", "sourceIPAddress": "ds.amazonaws.com", "userAgent": "ds.amazonaws.com", "requestParameters": null, "responseElements": { "ConsoleLogin": "Success" }, "additionalEventData": { "MobileVersion": "No", "MFAUsed": "No" }, "eventID": "399f238f-7142-4d8b-9e40-083fc6b4bc24", "readOnly": false, "eventType": "AwsConsoleSignIn", "managementEvent": true, "recipientAccountId": "<AWSアカウントID>", "eventCategory": "Management" }
"invokedBy": "ds.amazonaws.com"
など所々にAWS Directory Serviceから呼び出されたということが分かる情報が記録されていますね。一方で、Managed Microsoft ADのIDやドメイン名は記録されていないので、どのディレクトリの認証情報を使ったのか判断するのが難しいです。Admin
などよく使われる名前を使用する場合はトラブルシューティングに手こずりそうです。
グループ単位でマネジメントコンソールへのアクセスを許可
ドメインユーザーとセキュリティグループの作成
グループ単位でマネジメントコンソールへのアクセスを許可することもできるようなので、やってみます。
まず、ドメインに参加しているWindows Server 2022でActive DirectoryやDNSの管理ツール、グループポリシー管理などManaged Microsoft ADの管理に必要な機能をインストールします。
# 現在インストールされている役割と機能の確認 > Get-WindowsFeature | Where-object {$_.Installed -eq $True} Display Name Name Install State ------------ ---- ------------- [X] File and Storage Services FileAndStorage-Services Installed [X] Storage Services Storage-Services Installed [X] .NET Framework 4.8 Features NET-Framework-45-Fea... Installed [X] .NET Framework 4.8 NET-Framework-45-Core Installed [X] WCF Services NET-WCF-Services45 Installed [X] TCP Port Sharing NET-WCF-TCP-PortShar... Installed [X] Microsoft Defender Antivirus Windows-Defender Installed [X] System Data Archiver System-DataArchiver Installed [X] Windows PowerShell PowerShellRoot Installed [X] Windows PowerShell 5.1 PowerShell Installed [X] WoW64 Support WoW64-Support Installed [X] XPS Viewer XPS-Viewer Installed # Active DirectoryやDNSの管理ツール、グループポリシー管理をインストール > Install-WindowsFeature -Name RSAT-ADDS,RSAT-DNS-Server,GPMC Success Restart Needed Exit Code Feature Result ------- -------------- --------- -------------- True No Success {Group Policy Management, Remote Server Ad... # インストールされたことを確認 > Get-WindowsFeature | Where-object {$_.Installed -eq $True} Display Name Name Install State ------------ ---- ------------- [X] File and Storage Services FileAndStorage-Services Installed [X] Storage Services Storage-Services Installed [X] .NET Framework 4.8 Features NET-Framework-45-Fea... Installed [X] .NET Framework 4.8 NET-Framework-45-Core Installed [X] WCF Services NET-WCF-Services45 Installed [X] TCP Port Sharing NET-WCF-TCP-PortShar... Installed [X] Group Policy Management GPMC Installed [X] Microsoft Defender Antivirus Windows-Defender Installed [X] Remote Server Administration Tools RSAT Installed [X] Role Administration Tools RSAT-Role-Tools Installed [X] AD DS and AD LDS Tools RSAT-AD-Tools Installed [X] Active Directory module for Windows ... RSAT-AD-PowerShell Installed [X] AD DS Tools RSAT-ADDS Installed [X] Active Directory Administrative ... RSAT-AD-AdminCenter Installed [X] AD DS Snap-Ins and Command-Line ... RSAT-ADDS-Tools Installed [X] DNS Server Tools RSAT-DNS-Server Installed [X] System Data Archiver System-DataArchiver Installed [X] Windows PowerShell PowerShellRoot Installed [X] Windows PowerShell 5.1 PowerShell Installed [X] WoW64 Support WoW64-Support Installed [X] XPS Viewer XPS-Viewer Installed
PowerShellでドメインユーザーとセキュリティグループを作成し、セキュリティグループにドメインユーザーを追加します。
# ドメインユーザーの作成 > New-ADUser ` -Name "AWSLoginUser" ` -UserPrincipalName "[email protected]" ` -Accountpassword (Read-Host -AsSecureString "AccountPassword") ` -Path "OU=Users,OU=corp,DC=corp,DC=non-97,DC=net" ` -PasswordNeverExpires $True ` -Enabled $True AccountPassword: ******************************** # セキュリティグループの作成 > New-ADGroup ` -Name AWSLoginGroup ` -GroupCategory Security ` -GroupScope Global ` -Path "OU=Users,OU=corp,DC=corp,DC=non-97,DC=net" # セキュリティグループにドメインユーザーを追加 > Add-ADGroupMember -Identity AWSLoginGroup -Members AWSLoginUser # セキュリティグループにドメインユーザーが追加されたことを確認 > Get-ADGroupMember -Identity AWSLoginGroup distinguishedName : CN=AWSLoginUser,OU=Users,OU=corp,DC=corp,DC=non-97,DC=net name : AWSLoginUser objectClass : user objectGUID : c2bccf11-f4ee-431b-b15c-ce2998e91825 SamAccountName : AWSLoginUser SID : S-1-5-21-1042898337-254592246-1083546402-1147
グループの追加
作成したセキュリティグループに所属しているドメインユーザーがIAMロールにAssumeRoleし、マネジメントコンソールにログインできるようにします。
グループで検索
を選択し、グループを指定して追加
をクリックします。
グループが追加されたことを確認します。
動作確認
`https://アクセスURL/console/`し、セキュリティグループに所属しているドメインユーザーの認証情報を入力し、`サインイン`をクリックします。
正常にログインできました。フェデレーティッドユーザーを確認すると、確かに追加したグループに所属しているドメインユーザーであることが分かります。
IAMユーザーの管理を極力したくない時に使えるかも
AWS Managed Microsoft ADの認証情報を使ってAWSマネジメントコンソールにログインしてみました。
ドメインユーザーの認証情報をそのまま使えるので、IAMユーザーの管理を極力したくない時に使えるかもしれませんね。
マネジメントコンソールにログインする際のIAMロールにユーザーやグループを追加する際に、信頼されたフォレストを選択することが可能です。そのため、Managed Microsoft ADとオンプレミスのAD間で信頼関係を作成すれば、オンプレミスのADで管理しているドメインユーザーの認証情報でマネジメントコンソールにログインすることも可能そうです。
[Add users and groups to role] (ロールへのユーザーとグループの追加) ページの [Select Active Directory Forest] (Active Directory フォレストの選択) で、AWS Managed Microsoft AD フォレスト (このフォレスト) またはオンプレミスフォレスト (信頼されたフォレスト) の内、AWS Management Console へのアクセスが必要なアカウントが含まれている方を選択します。信頼されたフォレストの設定方法の詳細については、「チュートリアル: AWS Managed Microsoft AD とセルフマネージド Active Directory ドメイン間で信頼関係を作成する - AWS Directory Service」を参照してください。
一方で、Managed Microsoft ADはリージョナルサービスです。そのため、Managed Microsoft ADがいるリージョンに障害が発生してしまうとログインできなくなってしまいます。可用性を向上させる場合にはマルチリージョンレプリケーションの設定も考える必要があります。
セキュリティ面で言うと、「MFAが設定されていない場合はログインさせない」といった制限をすることができません。ログインURLとドメインユーザーの認証情報が分かればマネジメントコンソールにログインできてしまうので、AWS側でMFAによる制限を強制できないのはちょっと心配です。
料金的にも、単純に「ADの認証情報を使いたい」という要件だけでは、Managed Microsoft ADを構築するのは料金とのバランス的にあまりないのではと考えます。
以上のことから、個人的には「AWS IAM Identity Centerが使用できない」 & 「既存のADの認証情報を使ってログインできないと困る」という要件が出てきた時に使うかなという印象を持ちました。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!